import 'package:ducafe_ui_core/ducafe_ui_core.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart' hide SnackPosition;
import '../../common/index.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../community/controller.dart';

class PostDetailController extends GetxController {
  PostDetailController();

  final UserService _user_service = UserService();
  final RxSet<String> _reported_posts = <String>{}.obs;
  final RxList<CommentModel> comments_list = <CommentModel>[].obs;
  String? current_post_id;

  // 添加一个存储当前帖子数据的变量
  Rxn<PostModel> current_post = Rxn<PostModel>();

  _init_data() async {
    // 如果有缓存的帖子数据，尝试刷新评论
    if (current_post.value != null) {
      try {
        // 获取最新帖子数据
        final updated_post = await PostService().get_post_by_id(
          current_post.value!.post_id,
        );
        if (updated_post != null) {
          // 更新控制器中的帖子数据
          current_post.value = updated_post;
          // 刷新评论列表
          await refreshComments(updated_post.post_content_list);
          // 更新控制器中的当前帖子ID
          current_post_id = updated_post.post_id;
        }
      } catch (e) {
        debugPrint('加载帖子详情错误: $e');
      }
    }

    update(["post_detail"]);
  }

  // 初始化帖子数据
  void set_current_post(PostModel post) {
    current_post.value = post;
    current_post_id = post.post_id;
  }

  // 获取当前帖子数据，如果页面重建也能获取
  PostModel? get_current_post() {
    return current_post.value;
  }

  Future<void> refreshComments(List<String> post_content_list) async {
    final comments = await get_comments(post_content_list);
    comments_list.clear();
    comments_list.addAll(comments);
  }

  // 添加评论
  Future<bool> addition_comment(String postId, String content) async {
    try {
      // 检查用户是否登录
      final current_user = _user_service.get_now_user();
      if (current_user == null) {
        // 提示用户登录
        SmartDialogHelper.show_warning('please login first before commenting');
        RouteUtil.push(RouteNames.login);
        return false;
      }

      // 调用CommonService添加评论
      final success = await CommonService().addition_comment(
        postId,
        content,
        current_user,
      );

      if (success) {
        // 获取更新后的帖子以获取最新的评论列表
        final updated_post = await PostService().get_post_by_id(postId);
        if (updated_post != null) {
          // 刷新评论列表
          await refreshComments(updated_post.post_content_list);
        }
        // 刷新UI
        update(["post_detail"]);
      }

      return success;
    } catch (e) {
      debugPrint('添加评论失败: $e');
      return false;
    }
  }

  // 检查帖子是否已点赞
  bool is_liked(String post_id) {
    final current_user = _user_service.get_now_user();
    if (current_user == null) return false;

    final likes = current_user.like_lists ?? [];

    return likes.contains(post_id);
  }

  // 处理点赞
  void toggle_like(String post_id) {
    final current_user = _user_service.get_now_user();
    if (current_user == null) {
      SmartDialogHelper.show_warning('please login first before liking');
      RouteUtil.push(RouteNames.login);
      return;
    }

    // 用户已登录，继续处理点赞逻辑
    final likes = current_user.like_lists ?? [];
    List<String> updated_likes = [];

    if (likes.contains(post_id)) {
      // 取消点赞
      updated_likes = likes.where((id) => id != post_id).toList();
    } else {
      // 添加点赞
      updated_likes = [...likes, post_id];
    }

    // 更新用户点赞列表
    final updated_user = current_user.copyWith(like_lists: updated_likes);
    _user_service.set_user(updated_user);

    // 更新详情页
    update(["post_detail"]);

    // 如果社区控制器已注册，也更新社区页面
    if (Get.isRegistered<CommunityController>()) {
      final communityController = Get.find<CommunityController>();
      communityController.update(["community"]);
    }
  }

  // 获取评论列表
  Future<List<CommentModel>> get_comments(List<String> commentIds) async {
    if (commentIds.isEmpty) {
      debugPrint('评论ID为空');
      return [];
    }

    List<CommentModel> comments = [];

    // 使用getCommentById方法逐个获取评论
    for (final id in commentIds) {
      final comment = await CommonService().get_comment_by_id(id);
      if (comment != null) {
        comments.add(comment);
      } else {
        debugPrint('未找到评论: $id');
      }
    }

    debugPrint('当前帖子的评论数: ${comments.length}');
    return comments;
  }

  // 举报帖子
  void report_post(String post_id, String reason) {
    final current_user = _user_service.get_now_user();

    // 检查用户是否登录
    if (current_user == null) {
      // 提示用户登录
      SmartDialogHelper.show_warning('please login first before reporting');
      RouteUtil.push(RouteNames.login);
      return;
    }

    // 将帖子添加到当前用户的举报列表
    _reported_posts.add(post_id);

    // 如果已点赞，则取消点赞
    if (is_liked(post_id)) {
      toggle_like(post_id);
    }

    // 保存到本地存储（持久化）
    _saveReportedPosts();

    // 向用户反馈
    Get.log("用户已举报帖子: $post_id, 原因: $reason");

    update(["post_detail", "community"]);
  }

  // 保存举报的帖子到本地存储
  void _saveReportedPosts() async {
    try {
      final prefs = await SharedPreferences.getInstance();
      final user_id = _user_service.get_now_user()?.id ?? '';
      if (user_id.isNotEmpty) {
        final key = 'reported_posts_$user_id';
        await prefs.setStringList(key, _reported_posts.toList());

        // 更新UI
        update(["post_detail", "community"]);

        // 如果社区控制器已注册，也更新社区页面
        if (Get.isRegistered<CommunityController>()) {
          final communityController = Get.find<CommunityController>();
          communityController.refresh_posts();
        }
      }
    } catch (e) {
      Get.log('保存举报帖子失败: $e');
    }
  }

  // 隐藏帖子并举报
  Future<bool> hide_post_for_current_user(String post_id, String reason) async {
    try {
      final current_user = _user_service.get_now_user();

      // 检查用户是否登录
      if (current_user == null) {
        SmartDialogHelper.show_warning('please login first before reporting');
        RouteUtil.push(RouteNames.login);
        return false;
      }

      // 将帖子添加到当前用户的举报列表
      _reported_posts.add(post_id);

      // 如果已点赞，则取消点赞
      if (is_liked(post_id)) {
        toggle_like(post_id);
      }

      // 将被举报的帖子保存到sp中
      final reportedPosts = Storage().get_list(
        "${Constants.reported_posts}_${current_user.name}",
      );
      if (reportedPosts.isEmpty) {
        Storage().set_list("${Constants.reported_posts}_${current_user.name}", [
          post_id,
        ]);
      } else {
        reportedPosts.add(post_id);
        Storage().set_list(
          "${Constants.reported_posts}_${current_user.name}",
          reportedPosts,
        );
      }

      // 记录举报信息（在实际应用中，这里可能会有API调用）
      Get.log("用户已举报帖子: $post_id, 原因: $reason");

      // 更新相关界面
      update(["post_detail", "community"]);

      return true;
    } catch (e) {
      Get.log('隐藏帖子失败: $e');
      return false;
    }
  }

  // 处理举报操作
  Future<void> handle_report(
    BuildContext context,
    String reason,
    String post_id,
  ) async {
    // 关闭报告对话框
    Navigator.pop(context);

    // 显示处理中的提示
    showDialog(
      context: context,
      barrierDismissible: false,
      builder: (dialogContext) => Dialog(
        backgroundColor: Color.fromARGB(170, 133, 178, 237), // 浅蓝色半透明背景
        child: Padding(
          padding: EdgeInsets.all(20.r),
          child: Row(
            mainAxisSize: MainAxisSize.min,
            children: [
              CircularProgressIndicator(color: Colors.white),
              SizedBox(width: 20.w),
              Text(
                'Processing...',
                style: TextStyle(color: Colors.white, fontSize: 14.sp),
              ),
            ],
          ),
        ),
      ),
    );

    try {
      // 确保获取正确的控制器实例

      // 在控制器中隐藏该帖子在用户社区界面的显示
      bool success = await hide_post_for_current_user(post_id, reason);

      if (success) {
        // 显示成功消息
        SmartDialogHelper.show_success(
          'The post has been reported and hidden in your community.',
        );
        Navigator.of(context).pop();
        // 如果社区控制器已注册，刷新社区帖子列表
        if (Get.isRegistered<CommunityController>()) {
          final communityController = Get.find<CommunityController>();
          communityController.refresh_posts();
        }

        Future.delayed(Duration(milliseconds: 500), () {
          // 直接返回到社区页面
          RouteUtil.go(RouteNames.community);
        });
      } else {
        // 显示错误消息
        SmartDialogHelper.show_error(
          'Failed to report the post, please try again',
        );
      }
    } catch (e) {
      // 关闭加载对话框（如果有错误也要确保关闭）
      if (Navigator.of(context).canPop()) {
        Navigator.of(context).pop();
      }
      debugPrint('举报处理错误: $e');

      // 显示错误消息
      SmartDialogHelper.show_error(
        'Failed to report the post, please try again',
      );
    }
  }

  // 关闭键盘
  void hide_keyboard() {
    FocusManager.instance.primaryFocus?.unfocus();
  }

  @override
  void onReady() {
    super.onReady();
    _init_data();
  }

  @override
  void onInit() {
    super.onInit();
  }
}
